/**
 * 
 */
package join.web.controller;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import join.model.beans.CronogramaActividad;
import join.model.beans.Plantilla;
import join.model.beans.Proyecto;
import join.model.beans.ProyectoInforme;
import join.model.repositories.CronogramaActividadRepository;
import join.model.repositories.PlantillaRepository;
import join.model.repositories.ProyectoInformeRepository;
import join.model.repositories.ProyectoParticipanteRepository;
import join.model.repositories.ProyectoRepository;
import join.util.AppListUtil;
import net.sf.jxls.transformer.XLSTransformer;

import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author Cesar Rodriguez
 *
 */

@Controller
@RequestMapping("/proyecto/{proyectoId}/informe")
public class ProyectoInformeController {
	@Autowired
    private ServletContext context;
	
	@Autowired
	ProyectoRepository proyectoRepo;
	
	@Autowired
	ProyectoInformeRepository proyectoInformeRepo;
	
	@Autowired
	PlantillaRepository plantillaRepository;
	
	@Autowired
	CronogramaActividadRepository cronogramaActividadRepository;
	
	@Autowired
	ProyectoParticipanteRepository proyectoParticipanteRepo;
	
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView lst(HttpServletRequest request,
			HttpServletResponse response,  @PathVariable Long proyectoId) throws Exception {
		
		Proyecto p = proyectoRepo.findOne(proyectoId);
		List<ProyectoInforme> lp = (List<ProyectoInforme>) proyectoInformeRepo.findByProyecto(proyectoId);
		
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("proyecto", p);
		model.put("list", lp);

		return new ModelAndView("project/proyectoInformeLst", "model", model);
	}
	
	@RequestMapping(value = "/preload", method = RequestMethod.GET)
	public ModelAndView preload(ModelMap model, @PathVariable Long proyectoId){
		ProyectoInforme pi = new ProyectoInforme();
		
		Proyecto p = proyectoRepo.findOne(proyectoId);
		pi.setProyecto(proyectoId);
		
		//Objetos Principales
		model.put("proyecto", p);
		model.put("proyectoInforme", pi);

		//Carga de Listas
		loadLists(model, p);
		
		return new ModelAndView("project/proyectoInformeAdm", "model", model);
	}
	
	@RequestMapping(value = "/{informeId}/load", method = RequestMethod.GET)
	public ModelAndView load(ModelMap model, @PathVariable Long proyectoId, @PathVariable Long informeId){
		Proyecto p = proyectoRepo.findOne(proyectoId);
		ProyectoInforme pi = proyectoInformeRepo.findOne(informeId);

		//Objetos principales
		model.put("proyecto", p);
		model.put("proyectoInforme", pi);
		
		//Carga de listas
		loadLists(model, p);

		return new ModelAndView("project/proyectoInformeAdm", "model", model);
	}
	
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	public ModelAndView save(@ModelAttribute("proyectoInforme") ProyectoInforme nuevoInforme,  
			ModelMap model, HttpServletRequest request,
			HttpServletResponse response, @PathVariable Long proyectoId) throws Exception{
		
		nuevoInforme.setProyecto(proyectoId);
		proyectoInformeRepo.save(nuevoInforme);
		
		return lst(request, response, proyectoId);
	}
	
	@RequestMapping(value = "/{informeId}/build", method = RequestMethod.GET)
	public ModelAndView build(ModelMap model, HttpServletRequest request, 
			HttpServletResponse response, @PathVariable Long proyectoId, @PathVariable Long informeId) throws Exception{
		Proyecto p = proyectoRepo.findOne(proyectoId);
		ProyectoInforme pi = proyectoInformeRepo.findOne(informeId);

		//Objetos principales
		model.put("proyecto", p);
		model.put("proyectoInforme", pi);
		
		ServletOutputStream os = response.getOutputStream();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=\"actividades.xls\"");
		
		/*List<CronogramaActividad> actividads = new ArrayList<CronogramaActividad>();
        // initilize list of departments in some way
        Map<String, Object> beans = new HashMap<String, Object>();
        beans.put("actividades", actividads);
        XLSTransformer transformer = new XLSTransformer();
        transformer.transformXLS("repActividades.xls", beans, "repActividades2.xls");
		
		//Carga de listas
		loadLists(model, p);*/
        
        String reportLocation = context.getRealPath("docs");
        
        List<CronogramaActividad> lpp = cronogramaActividadRepository.findByCronograma(p.getCronograma());
        
        //List<ProyectoParticipante> lpp = proyectoParticipanteRepo.findByProyecto(p.getId()); 
        
        // initilize list of departments in some way
        Map<String, Object> beans = new HashMap<String, Object>();
        beans.put("actividades", lpp);
        XLSTransformer transformer = new XLSTransformer();
        
        try{
        	Workbook workbook = transformer.transformXLS(new FileInputStream(reportLocation + "/actividades.xls"), beans);
        	workbook.write(os);
        	os.flush();
        	return null;
        }catch (Exception e){
        	e.printStackTrace();
        	return lst(request, response, proyectoId);
        }
	}
	
	
	/**
	 * Carga de listados
	 * @param model
	 * @param p
	 */
	private void loadLists(ModelMap model, Proyecto p){
		List<Plantilla> lp = plantillaRepository.findByTipoAndReferenciaAndReferenciaCodigo("REP", "TPR", null);
		List<Plantilla> lp2 = plantillaRepository.findByTipoAndReferenciaAndReferenciaCodigo("REP", "TPR", p.getTipo());
		
		lp.addAll(lp2);
		
		Map<String, String> mp = new LinkedHashMap<String, String>();
		mp.put("", "");
		
		for (Plantilla pla : lp) {
			mp.put(pla.getId().toString(), pla.getDescripcion());
		}
		
		model.put("lpPlantilla", mp);
		model.put("lpPeriodo", AppListUtil.getLista("periodoUnidad"));
		model.put("lpTipo", AppListUtil.getLista("proyectoInformeTipo"));
		model.put("lpEstado", AppListUtil.getLista("proyectoInformeEstado"));
	}
}
